package cn.bytets.rpc.api.invoke;

import cn.bytets.rpc.api.message.RpcInvocation;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 创建代理类,该代理类的所有方法都会调用这里的invoke方法
 */
public class RpcInvoke implements InvocationHandler {

    private Invoker<?> invoker;

    public RpcInvoke(Invoker invoker){
        this.invoker = invoker;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String methodName = method.getName();
        if ("getClass".equals(methodName)) {
            return proxy.getClass();
        }
        if ("hashCode".equals(methodName)) {
            return proxy.hashCode();
        }
        if ("toString".equals(methodName)) {
            return proxy.toString();
        }
        if ("equals".equals(methodName)) {
            if (args.length == 1) {
                return proxy.equals(args[0]);
            }
            throw new IllegalArgumentException("Invoke method [" + methodName + "] argument number error.");
        }
        RpcInvocation invocation = new RpcInvocation(methodName,
                            method.getParameterTypes(),args,
                            method.getDeclaringClass().getName());
        return invoker.invoke(invocation).recreate();
    }
}
